package beanstao.util.j2ee.request;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import beanstao.util.exception.technical.parameter.ParameterIsNullOrEmptyException;
import beanstao.util.log.LogHelper;
import beanstao.util.store.IQD;
import beanstao.util.store.KV;
import beanstao.util.store.domainobject.Domain;


public class QDs
{
	/**
	 * 简单工厂创建RequestData的实例
	 * 
	 * @param objects <BR>
	 *            参数个数只有1个时，当参数是HttpServletRequest时，创建一个WebRequestData；<BR>
	 *            参数个数只有1个时，当参数是KV[]时，创建一个WhereRequestData（一个仅有查询条件的RequestData）；<BR>
	 *            参数个数只有1个时，当参数是String时，创建一个SimpleRequestData（这个RequestData里只包含查询的目标）；<BR>
	 *            参数个数只有3个时，第一个参数String，代表查询的目标；第二个参数是查询的条件的KEY，第三个参数是查询的值<BR>
	 *            参数个数只有2个时，第一个参数String，代表查询的目标；第二个参数是KV[]，代表一系列的查询条件<BR>
	 */
	public static IQD builder(final Object... objects)
	{
		if ((objects.length == 1) && (objects[0] instanceof HttpServletRequest))
			return web((HttpServletRequest) objects[0]);
		if ((objects.length == 1) && (objects[0] instanceof KV))
		{
			IQD data = new WhereQD((KV) objects[0]);
			return data;
		}
		if ((objects.length == 1) && (objects[0] instanceof Domain))
		{
			IQD data = new DomainQD((Domain) objects[0]);
			return data;
		}
		if ((objects.length == 1) && (objects[0] instanceof String))
			return new SimpleQD(objects[0].toString());
		if ((objects.length == 2) && (objects[0] instanceof String) && (objects[1] instanceof KV[]))
			return new SimpleQD(objects[0].toString(), (KV[]) objects[1]);
		if ((objects.length == 3) && (objects[0] instanceof String) && (objects[1] instanceof String))
			return new SimpleQD(objects[0].toString(), objects[1].toString(), objects[2]);
		return null;
	}

	/**
	 * 简单工厂创建RequestData的实例
	 * 
	 * @throws ParameterIsNullOrEmptyException
	 */
	protected static IQD web(final HttpServletRequest request) throws ParameterIsNullOrEmptyException
	{
		return web(request, request.getSession());
	}

	/**
	 * 简单工厂创建RequestData的实例
	 * 
	 * @throws ParameterIsNullOrEmptyException
	 */
	protected static IQD web(final Object request, final Object session) throws ParameterIsNullOrEmptyException
	{
		if ((null == request) || (null == session))
			throw new ParameterIsNullOrEmptyException();
		if ((request instanceof HttpServletRequest) && (session instanceof HttpSession))
		{
			WebQD wrd = new WebQD((HttpServletRequest) request, (HttpSession) session);
			if (!wrd.load())
			{
				LogHelper.logDebug(wrd, "没有解析到HttpSession。如果是用户登录，可以忽略本条警告。");
				return wrd;
			}
			return wrd;
		}
		return null;
	}
}
